package br.com.jk.endereco;

import br.com.jk.cidade.Cidade;
import java.io.Serializable;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.ForeignKey;

/**
 *
 * @author camilo
 */
@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {

  public static final int ENDERECO_CLIENTE = 0;
  public static final int ENDERECO_FORNECEDOR = 1;
  public static final int ENDERECO_EMPRESA = 2;
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;
  @Column(name = "tipo_endereco", nullable = false)
  private int tipoEndereco;
  @Column(name = EnderecoDao.NAME_COLUMN_ID_ENTIDADE, nullable = false)
  private int idEntidade;
  @Column(nullable = false)
  private String rua;
  private String complemento;
  @Column(nullable = false)
  private String numero;
  @Column(nullable = false)
  private String bairro;
  @ManyToOne
  @JoinColumn(name = "id_cidade", nullable = false)
  @ForeignKey(name = "fk_endereco_cidade")
  private Cidade cidade;
  @Column(nullable = false)
  private int cep;
  private String observacao;

  public int getIdEntidade() {
    return idEntidade;
  }

  public void setIdEntidade(int idEntidade) {
    this.idEntidade = idEntidade;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public int getTipoEndereco() {
    return tipoEndereco;
  }

  public void setTipoEndereco(int tipoEndereco) {
    this.tipoEndereco = tipoEndereco;
  }

  public String getRua() {
    return rua;
  }

  public void setRua(String rua) {
    this.rua = rua;
  }

  public String getComplemento() {
    return complemento;
  }

  public void setComplemento(String complemento) {
    this.complemento = complemento;
  }

  public String getNumero() {
    return numero;
  }

  public void setNumero(String numero) {
    this.numero = numero;
  }

  public String getBairro() {
    return bairro;
  }

  public void setBairro(String bairro) {
    this.bairro = bairro;
  }

  public Cidade getCidade() {
    return cidade;
  }

  public void setCidade(Cidade cidade) {
    this.cidade = cidade;
  }

  public int getCep() {
    return cep;
  }

  public void setCep(int cep) {
    this.cep = cep;
  }

  public String getObservacao() {
    return observacao;
  }

  public void setObservacao(String observacao) {
    this.observacao = observacao;
  }

  @Override
  public int hashCode() {
    int hash = 7;
    hash = 17 * hash + this.id;
    hash = 17 * hash + this.tipoEndereco;
    hash = 17 * hash + this.idEntidade;
    hash = 17 * hash + Objects.hashCode(this.rua);
    hash = 17 * hash + Objects.hashCode(this.complemento);
    hash = 17 * hash + Objects.hashCode(this.numero);
    hash = 17 * hash + Objects.hashCode(this.bairro);
    hash = 17 * hash + Objects.hashCode(this.cidade);
    hash = 17 * hash + this.cep;
    hash = 17 * hash + Objects.hashCode(this.observacao);
    return hash;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final Endereco other = (Endereco) obj;
    if (this.id != other.id) {
      return false;
    }
    if (this.tipoEndereco != other.tipoEndereco) {
      return false;
    }
    if (this.idEntidade != other.idEntidade) {
      return false;
    }
    if (!Objects.equals(this.rua, other.rua)) {
      return false;
    }
    if (!Objects.equals(this.complemento, other.complemento)) {
      return false;
    }
    if (!Objects.equals(this.numero, other.numero)) {
      return false;
    }
    if (!Objects.equals(this.bairro, other.bairro)) {
      return false;
    }
    if (!Objects.equals(this.cidade, other.cidade)) {
      return false;
    }
    if (this.cep != other.cep) {
      return false;
    }
    if (!Objects.equals(this.observacao, other.observacao)) {
      return false;
    }
    return true;
  }
}
